home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
examples
/
misc
/
editor.pro
next >
Wrap
Text File
|
1997-07-08
|
27KB
|
831 lines
; $Id: editor.pro,v 1.13 1997/03/05 19:52:01 alan Exp $
;
; Copyright (c) 1995-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME: Editor
;
; PURPOSE: Display an ASCII text file using widgets.
;
; MAJOR TOPICS: Text manipulation.
;
; CALLING SEQUENCE: Editor [, filename]
;
; INPUTS:
; Filename: A scalar string that contains the filename of the file
; to display. The filename can include a path to that file.
; If the filename is omitted, the user will be prompted for
; a filename, via the system function, DIALOG_PICKFILE().
;
; KEYWORD PARAMETERS:
; FONT: The name of the font to use. If omitted use the default
; font.
;
; HEIGHT: The number of text lines that the widget should display at one
; time. If this keyword is not specified, 24 lines is the
; default.
;
; WIDTH: The number of characters wide the widget should be. If this
; keyword is not specified, 80 characters is the default.
;
; PROCEDURE: Editor reads, writes and manipulates text strings ...
;
; MAJOR FUNCTIONS and PROCEDURES:
;
; COMMON BLOCKS and STRUCTURES:
;
; SIDE EFFECTS:
; Triggers the XMANAGER if it is not already in use.
;
; MODIFICATION HISTORY: Written by: WSO, RSI, January 1995
; Modified by: ...
;-
FUNCTION FindDelimiter, text, delimiters, column, row, delimiterIndex, $
endOfLineMarks, regionMarks, START_OF_LINE=startOfLine, $
END_OF_LINE=endOfLine
IF (KEYWORD_SET(startOfLine) NE 0) AND (column EQ 0) THEN $
RETURN, 1
IF (N_ELEMENTS(endOfLineMarks) EQ 0) THEN $
endOfLineMarks = ""
IF (N_ELEMENTS(regionMarks) EQ 0) THEN $
regionMarks = ""
delimiters = [delimiters, endOfLineMarks, regionMarks]
WHILE 1 DO BEGIN
lastColumn = STRLEN(text[row])-1
; Find the delimiter
WHILE (column LE lastColumn) DO BEGIN
delimiterIndex = STRPOS(delimiters, STRMID(text[row], column, 1))
delimiterGroup = (WHERE (delimiterIndex NE -1))[0]
CASE delimiterGroup OF
; If delimiter found is a region marker (quote, double quote, etc)
2: BEGIN ; Skip to next region marker
currentColumn = column + 1
column = STRPOS(STRMID(text[row], currentColumn, lastColumn-column), $
STRMID(delimiters[delimiterGroup], delimiterIndex[delimiterGroup], 1))
IF column EQ -1 THEN $
column = lastColumn + 1 $
ELSE $
column = column + currentColumn + 1
ENDCASE
; end of line mark found - force completion of for loop
1: column = lastColumn+1
; normal delimiter found
0: RETURN, 1
; Go to next column
ELSE: $
column = column + 1
ENDCASE
ENDWHILE
; We've reached the end of the current line
; If the keyword is set then return success
IF (KEYWORD_SET(endOfLine) NE 0) THEN $
RETURN, 1
; Go to the beginning of the next row of text
column = 0
row = row + 1
; Are we past the end of the last line of the text
IF ((SIZE(text))[0] EQ 0) OR (row GE (SIZE(text))[1]) THEN $
RETURN, 0
IF (KEYWORD_SET(startOfLine) NE 0) THEN $
RETURN, 1
ENDWHILE
; If the delimiters were not found in the string
RETURN, 0
END
PRO GetNextWord, wTextEdit, SKIP_NUMBERS=skipNumbers
; Define a list of characters that make words in the text
; Notice single quotes to avoid conflict with constant designaters
symbols = '0123456789'
alphabet = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
IF KEYWORD_SET(skipNumbers) NE 0 THEN $
wordCharacters = alphabet $
ELSE $
wordCharacters = alphabet + symbols
; Define a list of delimiters that separates words in the text
wordDelimiters = " (){}/@#&!?*%^~\|-+=<>.[]:, "
; Define the end of line if it's not the carriage return
endOfLineMarks = ";$"
; Define region delimiters to ignore - in our case strings
regionMarks = "'" + '"'
; Define all delimiters that could spearate words
allDelimiters = [wordDelimiters, endOfLineMarks, regionMarks]
; Get the text from the text widget
WIDGET_CONTROL, wTextEdit, GET_VALUE=text
; Get the cursor position as a character offset from start of text
cursorOffsetPos = WIDGET_INFO(wTextEdit, /TEXT_SELECT)
; This is the position to start the word search
startPos = cursorOffsetPos[0] + cursorOffsetPos[1]
; initialize wordlength to zero length - in case no word was found
wordLength = 0
; Convert the character offset to a column/row position
columnRow = WIDGET_INFO(wTextEdit, TEXT_OFFSET_TO_XY=startPos)
row = columnRow[1]
column = columnRow[0]
; Find the first delimiter
found = FindDelimiter(text, wordDelimiters, column, row, delimiterIndex, $
endOfLineMarks, regionMarks, /START_OF_LINE)
IF found THEN BEGIN
; Find the first alphanumeric character
found = FindDelimiter(text, wordCharacters, column, row, delimiterIndex, $
endOfLineMarks, regionMarks)
IF found THEN BEGIN
firstCharPos = [column, row]
; Find the second delimiter
found = FindDelimiter(text, wordDelimiters, column, row, delimiterIndex, $
endOfLineMarks, regionMarks, /END_OF_LINE)
wordLength = column - firstCharPos[0]
startPos = WIDGET_INFO(wTextEdit, TEXT_XY_TO_OFFSET=firstCharPos)
ENDIF
ENDIF
WIDGET_CONTROL, wTextEdit, SET_TEXT_SELECT=[startPos, wordLength]
WIDGET_CONTROL, wTextEdit, /INPUT_FOCUS
END
PRO FindText, state, token
; Get the text from the text widget
WIDGET_CONTROL, state.wTextEdit, GET_VALUE=text
; First get the current cursor position and see if any tokens were
; found after that position. If not circle back to the beginning
; of the text and continue searching from there.
; Get the cursor position as a character offset from start of text
cursorOffsetPos = WIDGET_INFO(state.wTextEdit, /TEXT_SELECT)
; Convert the character offset to a [column,row] position
cursorColumnRow = WIDGET_INFO(state.wTextEdit, $
TEXT_OFFSET_TO_XY=cursorOffsetPos[0]+cursorOffsetPos[1])
; For readability only convert the cursorColumnRow array to a structure
current = {column:cursorColumnRow[0], row:cursorColumnRow[1]}
; Search for a token in the current row after the current column
column = STRPOS(text[current.row], token, current.column)
; If any tokens were found on the current line -
IF column NE -1 THEN $
; Save this [column,row] position as the location where the token was found
location = [column, current.row] $
ELSE BEGIN
; The token wasn't found in the current row - therefore
; search for the token from the next row to the last row
nextRow = current.row+1
lastRow = (SIZE(text))[1]-1
; If at the end of the text widget
IF nextRow GT lastRow THEN $
location = -1 $
ELSE $
location = STRPOS(text[nextRow:lastRow], token)
; row is equal to the first row indice where a token was found
row = (WHERE(location GT -1))[0]
; If any tokens were found -
IF row NE -1 THEN $
; Save the token location [column, row]
location = [location[row], row+current.row+1] $
ELSE BEGIN
; The token wasn't found in the current row to the last row - therefore
; search for the token from the first row to the current row
location = STRPOS(text[0:current.row], token)
; row is equal to the first row indice where a token was found
row = (WHERE(location GT -1))[0]
; If any tokens were found -
IF row NE -1 THEN $
; Save the token location [column, row]
location = [location[row], row] $
ELSE $
location = -1
ENDELSE
ENDELSE
; If location[column] is valid - the token was found
IF location[0] GT -1 THEN BEGIN
; Get the character offset from the column, row position
startPos = WIDGET_INFO(state.wTextEdit, TEXT_XY_TO_OFFSET=location)
; Select the text that was found to match the search token
WIDGET_CONTROL, state.wTextEdit, SET_TEXT_SELECT=[startPos, STRLEN(token)]
; Enable the any controls that require text to be selected
TextSelected, state, 1
; Give the keyboard input focus back to the text widget
WIDGET_CONTROL, state.wTextEdit, /INPUT_FOCUS
ENDIF ELSE $
; Notify the user that the token was not found
button = DIALOG_MESSAGE(/INFO, 'The text "' + token + '" was not found.')
END
FUNCTION CountWords, wTextEdit
wordCount = 0
GetNextWord, wTextEdit, /SKIP_NUMBERS
; Get selection to see if word was found
cursorOffsetPos = WIDGET_INFO(wTextEdit, /TEXT_SELECT)
; While the word length is greater than zero - continue
WHILE cursorOffsetPos[1] GT 0 DO BEGIN
wordCount = wordCount + 1
GetNextWord, wTextEdit, /SKIP_NUMBERS
; Get selection to see if word was found
cursorOffsetPos = WIDGET_INFO(wTextEdit, /TEXT_SELECT)
ENDWHILE
RETURN, wordCount
END
PRO DisplayEditorInfo, parent
infoText = [ $
" Editor is an IDL example of a simple text "+ $
"editing application. It demonstrates the ability to read and "+ $
"write text from a file and display it in a text widget. It "+ $
"also provides a text search capability. ", "", $
' Files can be opened and saved via commands in the "File" '+ $
"menu on the window's menubar. The New command allows you "+ $
"to create a new text file. The Open menu command displays a "+ $
"standard file dialog to help you select a file to edit. The "+ $
"Save and Save As menu commands write the text files back out "+ $
"to the disk. The Exit Editor command will cause the Editor "+ $
"example to close and return to IDL.", "", $
" To search for text in the text editor, enter the desired "+ $
"text into the Find Text field and click the Find button."]
ShowInfo, TITLE="Editor Example Information", GROUP=parent, INFOTEXT=infoText, $
HEIGHT=15, WIDTH=80
END
PRO EditorKilled, widgetID
WIDGET_CONTROL, GET_UVALUE = state, widgetID, /NO_COPY
; If the Editor could be closed via the window manager, you would
; need to add a request here for the user to save any changes they
; might have made. Currently the only way to close this editor
; is through the "Exit Editor" menu command.
; No need to reset the user value since it will no longer be used
END
PRO RequestToSave, state
; If the user editted (changed) the text in the text editor...
IF state.textEditted NE 0 THEN BEGIN
; See if they want to save any changes they made
buttonPushed = DIALOG_MESSAGE(/QUESTION, $
["Save changes to ", '"'+state.fileName+'"'])
; If the responded by clicking the "Yes" button ...
IF buttonPushed EQ "Yes" THEN BEGIN
; Save the text properly
IF state.fileName EQ "Untitled" THEN $
SaveAsText, state $
ELSE $
SaveText, state
ENDIF
ENDIF
END
PRO GetText, state, FILENAME=fileName
; If any current text changed in the text editor -
; request that the user save their changes first
RequestToSave, state
; If there isn't a filename defined - request one from the user
IF (NOT KEYWORD_SET(fileName)) THEN $
fileName = DIALOG_PICKFILE(GROUP=state.wEditorWindow)
; If the user didn't cancel the standard file dialog or
; the filename already existed
IF STRLEN(fileName) GT 0 THEN BEGIN
; Save it in the state structure
state.fileName = fileName
; Set the title of the window to include the new file name
WIDGET_CONTROL, state.wEditorWindow, $
TLB_SET_TITLE="IDL Editor - " + state.fileName
; Display the wait cursor
WIDGET_CONTROL, state.wEditorWindow, /HOURGLASS
; Open the file to read
OPENR, unit, state.filename, /GET_LUN, ERROR=error
; If an error occurred
IF error LT 0 THEN $
; Notify the User that an error occurred
buttonPushed = DIALOG_MESSAGE( [!err_string, $
' Cannot open the file ' + state.filename] ) $
ELSE BEGIN
maxLines = 1000
lineIncrement = 250
text = STRARR(maxLines) ; Maximum # of lines
lineIndex = 0
lineOfText = ""
WHILE NOT EOF(unit) DO BEGIN
READF, unit, lineOfText
text[lineIndex] = lineOfText
lineIndex = lineIndex + 1
; If the maximum number of lines is hit,
; increase the array size by lineIncrement
IF (lineIndex EQ maxLines) THEN BEGIN
text = [text, STRARR(lineIncrement)]
maxLines = maxLines + lineIncrement
ENDIF
ENDWHILE
text = text[0:(lineIndex-1)>0]
FREE_LUN, unit ; Free and close the file unit.
; Initialize the flag to show the text is initially unchanged
state.textEditted = 0
; Insert the text into the text widget
WIDGET_CONTROL, state.wTextEdit, SET_VALUE=text
ENDELSE
ENDIF
END
PRO SaveAsText, state
; Request a filename by which the file is to be saved
fileName = DIALOG_PICKFILE(/WRITE, GROUP=state.wEditorWindow)
; If the user didn't cancel the standard file dialog
IF STRLEN(fileName) GT 0 THEN BEGIN
; Update the window title to reflect the new filename
WIDGET_CONTROL, state.wEditorWindow, TLB_SET_TITLE="IDL Editor - " + fileName
; Store the filename in the application's state structure
state.fileName = fileName
; Write the text to disk
SaveText, state
ENDIF
END
PRO SaveText, state
; Display the wait cursor
WIDGET_CONTROL, state.wEditorWindow, /HOURGLASS
; Open the file for writing
OPENW, unit, state.filename, /GET_LUN, ERROR=error
; If an error occurred - display an error message
IF error LT 0 THEN $
buttonPushed = DIALOG_MESSAGE([!err_string, $
'Can not display the file:', state.filename] ) $
ELSE BEGIN
; Get the text to save from the text widget
WIDGET_CONTROL, state.wTextEdit, GET_VALUE=text
; Count how many lines of text to save
lineCount = (SIZE(text))[1]
FOR lineIndex = 0, lineCount-1 DO $
; Write each line to the file
PRINTF, unit, text[lineIndex]
FREE_LUN, unit ; Free and close the file unit.
; Reset the flag to show the text is saved
state.textEditted = 0
ENDELSE
END
PRO TextSelected, state, enabled
; Update these widgets when text is selected or deselected
WIDGET_CONTROL, state.wUppercase, SENSITIVE=enabled
WIDGET_CONTROL, state.wLowercase, SENSITIVE=enabled
END
PRO EditorEventHdlr, event
; Get the state structure stored in the user value of the window
WIDGET_CONTROL, GET_UVALUE = state, event.top, /NO_COPY
; Determine in which widget the event occurred
CASE event.id OF
state.wEditorWindow: BEGIN ; The window has been sized
; Get the new size of the window
WIDGET_CONTROL, state.wEditorWindow, TLB_GET_SIZE=windowSize
; Determine the change in the window size
deltaX = windowSize[0] - state.windowSize[0]
deltaY = windowSize[1] - state.windowSize[1]
; Get the pixel size of the text widget
textEditGeometry = WIDGET_INFO(state.wTextEdit, /GEOMETRY)
; Determine the new size based on the amount the window grew
newTextEditXSize = textEditGeometry.scr_xsize + deltaX
newTextEditYSize = textEditGeometry.scr_ysize + deltaY
; Resize the text widget accordingly
WIDGET_CONTROL, state.wTextEdit, SCR_XSIZE=newTextEditXSize, $
SCR_YSIZE=newTextEditYSize
; Store the new size in the state structure for later comparisons
WIDGET_CONTROL, state.wEditorWindow, TLB_GET_SIZE=windowSize
state.windowSize = windowSize
ENDCASE
state.wNewButton: BEGIN
; If any text changed in the text editor -
; request that the user save the changes first
RequestToSave, state
; Set the default filename to "Untitled"
state.fileName = "Untitled"
; Initialize the flag to show the text is initially unchanged
state.textEditted = 0
; Clear any text currently in the text widget
WIDGET_CONTROL, state.wTextEdit, SET_VALUE=""
; Set the title of the window
WIDGET_CONTROL, event.top, $
TLB_SET_TITLE="IDL Editor - " + state.fileName
ENDCASE
state.wOpenButton: $
; Get the text from the file and insert it into the text widget
GetText, state
state.wSaveButton: BEGIN
; If a new file was created - first request a filename and save
IF state.fileName EQ "Untitled" THEN $
SaveAsText, state $
ELSE $
; Save the text to disk
SaveText, state
ENDCASE
state.wSaveAsButton: $
; Request a filename and save the file to disk
SaveAsText, state
state.wExitButton: BEGIN
; If any text changed in the text editor -
; request that the user save the changes first
RequestToSave, state
; Restore the state value before the widget app is destroyed
; so the KILL_NOTIFY procedure can still use it
WIDGET_CONTROL, SET_UVALUE = state, event.top, /NO_COPY
; Exit the IDL Editor widget application
WIDGET_CONTROL, event.top, /DESTROY
RETURN
ENDCASE
state.wTextEdit: BEGIN
; If text has been selected enable the appropriate widgets
; initially assume that no text is selected
selected = 0
; If the user selected some text
IF event.type EQ 3 THEN BEGIN
IF event.length GT 0 THEN $
selected = 1 ; Enable the upper and lower case pushbuttons
ENDIF ELSE $
; The user entered or deleted text in the text widget
; therefore flag the text as changed to force SAVE request
state.textEditted = 1
TextSelected, state, selected
ENDCASE
state.wFindTextID: BEGIN
; Get the text to search for from the Find Text widget
WIDGET_CONTROL, event.id, GET_VALUE=findText
; If the user has entered text into the Find Text field -
IF STRLEN(findText[0]) GT 0 THEN $
WIDGET_CONTROL, state.wFind, /SENSITIVE $ ; enable the Find button
ELSE $
WIDGET_CONTROL, state.wFind, SENSITIVE=0 ; disable the Find button
ENDCASE
state.wFind: BEGIN
; Get the text to search for from the Find Text widget
WIDGET_CONTROL, state.wFindTextID, GET_VALUE=findText
; If there is at least one character ...
IF STRLEN(findText[0]) GT 0 THEN $
; Search for the text in the editor
FindText, state, findText[0]
ENDCASE
state.wUppercase: BEGIN
; Get the selected text in the editor
WIDGET_CONTROL, state.wTextEdit, GET_VALUE=selection, /USE_TEXT_SELECT
; If there is at least one character selected...
IF STRLEN(selection[0]) GT 0 THEN BEGIN
; Convert the selection to uppercase
selection = STRUPCASE(selection)
; Set the selection to the uppercase conversion
WIDGET_CONTROL, state.wTextEdit, SET_VALUE=selection, $
/USE_TEXT_SELECT, /NO_NEWLINE
ENDIF
ENDCASE
state.wLowercase: BEGIN
; Get the selected text in the editor
WIDGET_CONTROL, state.wTextEdit, GET_VALUE=selection, /USE_TEXT_SELECT
; If there is at least one character selected...
IF STRLEN(selection[0]) GT 0 THEN BEGIN
; Convert the selection to lowercase
selection = STRLOWCASE(selection)
; Set the selection to the lowercase conversion
WIDGET_CONTROL, state.wTextEdit, SET_VALUE=selection, $
/USE_TEXT_SELECT, /NO_NEWLINE
ENDIF
ENDCASE
state.wNextWord: BEGIN
GetNextWord, state.wTextEdit, /SKIP_NUMBERS
; Get selection to see if word was found
cursorOffsetPos = WIDGET_INFO(state.wTextEdit, /TEXT_SELECT)
enabled = (cursorOffsetPos[1] GT 0)
WIDGET_CONTROL, state.wUppercase, SENSITIVE=enabled
WIDGET_CONTROL, state.wLowercase, SENSITIVE=enabled
ENDCASE
state.wCountWords: BEGIN
start = SYSTIME(1)
wordCount = CountWords( state.wTextEdit )
displayText = 'The number of words in "' + state.fileName + $
'" is ' + STRING(wordCount, FORMAT='(I0)')
buttonPushed = DIALOG_MESSAGE(/INFORMATION, displayText)
ENDCASE
state.wInfo: $ ; Display information about the IDL Editor
DisplayEditorInfo, event.top
ELSE: $ ; We erroneously received an event for a widget we weren't expecting
buttonPushed = DIALOG_MESSAGE("An event occurred for a non-existent widget")
ENDCASE
; Reset the windows user value to the updated state structure
WIDGET_CONTROL, SET_UVALUE = state, event.top, /NO_COPY
END
PRO Editor, fileName, WIDTH = WIDTH, HEIGHT = HEIGHT, FONT = font, GROUP = group
; If keywords not set - set to defaults
IF (NOT(KEYWORD_SET(height))) THEN $
height = 24
IF(NOT(KEYWORD_SET(width))) THEN $
width = 80
; Create the text editor window with a menu bar
wEditorWindow = WIDGET_BASE(TITLE = "IDL Editor - Untitled", $
MBAR=menuBar, /COLUMN, /TLB_SIZE_EVENTS, $
TLB_FRAME_ATTR=8)
; Build the menubar
wFileMenu = WIDGET_BUTTON(menuBar, VALUE="File", /MENU)
; Add the following menu items to the window's File menu
wNewButton = WIDGET_BUTTON(wFileMenu, VALUE="New")
wOpenButton = WIDGET_BUTTON(wFileMenu, VALUE="Open...")
wSaveButton = WIDGET_BUTTON(wFileMenu, /SEPARATOR, VALUE="Save")
wSaveAsButton = WIDGET_BUTTON(wFileMenu, VALUE="Save As...")
wExitButton = WIDGET_BUTTON(wFileMenu, /SEPARATOR, VALUE="Exit Editor")
; If the FONT keyword was defined with a font
IF N_ELEMENTS(font) GT 0 THEN $
; Create the text editor's text widget with the specified font
wTextEdit = WIDGET_TEXT(wEditorWindow, XSIZE=WIDTH, YSIZE=HEIGHT, $
/SCROLL, FONT=font, /EDITABLE, /ALL_EVENTS) $
ELSE $
; Create the text editor's text widget with the default font
wTextEdit = WIDGET_TEXT(wEditorWindow, XSIZE=WIDTH, YSIZE=HEIGHT, $
/SCROLL, /EDITABLE, /ALL_EVENTS)
; Create a base for all the edit controls (button, etc.)
wControlBase = WIDGET_BASE(wEditorWindow, /COLUMN)
wTopBase = WIDGET_BASE(wControlBase, SPACE=20, /ROW)
wFindBase = WIDGET_BASE(wTopBase, /ROW)
; Create a label for the search text field
wFindLabel = WIDGET_LABEL(wFindBase, VALUE="Find Text:")
; Create the search text field
wFindTextID = WIDGET_TEXT(wFindBase, XSIZE=24, YSIZE=1, $
/EDITABLE, /ALL_EVENTS)
; Create the search text pushbutton
wFind = WIDGET_BUTTON(wFindBase, VALUE = "Find")
; Create a pushbutton to display information about this application
wInfo = WIDGET_BUTTON(wTopBase, VALUE = "Info...")
wBottomBase = WIDGET_BASE(wControlBase, /ROW, SPACE=60)
wCaseBase = WIDGET_BASE(wBottomBase, /ROW)
wUppercase = WIDGET_BUTTON(wCaseBase, VALUE = "Uppercase")
wLowercase = WIDGET_BUTTON(wCaseBase, VALUE = "Lowercase")
wWordBase = WIDGET_BASE(wBottomBase, /ROW)
wNextWord = WIDGET_BUTTON(wWordBase, VALUE = "Next Word")
wCountWords = WIDGET_BUTTON(wWordBase, VALUE = "Count Words")
; Initially disable the pushbuttons, until the required user event
WIDGET_CONTROL, wUppercase, SENSITIVE=0
WIDGET_CONTROL, wLowercase, SENSITIVE=0
WIDGET_CONTROL, wFind, SENSITIVE=0
; Save the widget ids and other parameters to be accessed throughout
; this widget application. This state structure will be stored
; in the user value of the window and can be retreived through the
; GET_UVALUE keyword of the IDL WIDGET_CONTROL procedure
state = { $
wEditorWindow : wEditorWindow, $
wNewButton : wNewButton, $
wOpenButton : wOpenButton, $
wSaveButton : wSaveButton, $
wSaveAsButton : wSaveAsButton, $
wExitButton : wExitButton, $
wTextEdit : wTextEdit, $
wUppercase : wUppercase, $
wLowercase : wLowercase, $
wNextWord : wNextWord, $
wCountWords : wCountWords, $
wFindTextID: wFindTextID, $
wFind : wFind, $
wInfo : wInfo, $
windowSize : [0,0], $
textEditted : 0, $
fileName : "Untitled" $
}
; Make the window visible
WIDGET_CONTROL, wEditorWindow, /REALIZE
; Display the wait cursor
WIDGET_CONTROL, state.wEditorWindow, /HOURGLASS
; Get the text to be displayed in the text widget
GetText, state, FILENAME=fileName
; Get the current window size to be used when the user resizes the window
WIDGET_CONTROL, wEditorWindow, TLB_GET_SIZE=windowSize
; Save it in the state structure
state.windowSize = windowSize
; Save the state structure in the window's user value
WIDGET_CONTROL, wEditorWindow, SET_UVALUE=state
; Register this widget application with the widget manager
Xmanager, "Editor", wEditorWindow, GROUP_LEADER=group, $
EVENT_HANDLER="EditorEventHdlr", CLEANUP="EditorKilled", /NO_BLOCK
END ;--------------------- procedure Editor ----------------------------